/*
* INSANE - Interactive Structural Analysis Environment
*
* Copyright (C) 2003-2005
* Universidade Federal de Minas Gerais
* Escola de Engenharia
* Departamento de Engenharia de Estruturas
* 
* Author's email :    insane@dees.ufmg.br
* Author's website :  http://www.dees.ufmg.br/insane
* 
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or any later version.
* 
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
* GNU General Public License for more details.
* 
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
*/
package br.ufmg.dees.insane.shape;

import br.ufmg.dees.insane.util.IMatrix;
import br.ufmg.dees.insane.util.IVector;

/**
*A class representing a cubic shape in one dimension and cartesian coordinates.
*
*@author Fonseca, Flavio & Pitangueira, Roque
*@version 1.0
*@since September 2003
*@see model.discrete.element.FrameElement
*/

public class Cubic1DCart extends Shape1DCart {
	
	private static final long serialVersionUID = 1L;
	
	/** Constructs a Cubic1DCart shape.*/
	public Cubic1DCart() {
	}
	
	/* (non-Javadoc)
     * @see br.ufmg.dees.insane.Shape.Shape#getShapeFunction
     */
	public IVector getShapeFunction(double[] g, IMatrix cN) {
		double l = cN.getElement(0,0) - cN.getElement(1,0);
		double a = g[0];
		IVector n = new IVector(4);
		double n0 = (2*a*a*a - 3*a*a*l + l*l*l) / (l*l*l);
		double n1 = (a*a*a*l - 2*a*a*l*l + a*l*l*l) / (l*l*l);
		double n2 = (-2*a*a*a + 3*a*a*l) / (l*l*l);
		double n3 = (a*a*a*l - a*a*l*l) / (l*l*l);
		n.setElement(0, n0);
		n.setElement(1, n1);
		n.setElement(2, n2);
		n.setElement(3, n3);
		return (n);
	}
	
	/* (non-Javadoc)
     * @see br.ufmg.dees.insane.Shape.Shape#getDerivedShapeFunction
     */
	public IMatrix getDerivedShapeFunction(double[] g, IMatrix cN) {
		double l = cN.getElement(0,0) - cN.getElement(1,0);
		double a = g[0];
		IMatrix n = new IMatrix(4, 1);
        double n0 = (6*a*a - 6*a*l) / (l*l*l);
        double n1 = (3*a*a*l - 4*a*l*l + l*l*l) / (l*l*l);
        double n2 = (-6*a*a + 6*a*l) / (l*l*l);
        double n3 = (3*a*a*l - 2*a*l*l) / (l*l*l);
        n.setElement(0, 0, n0);
        n.setElement(1, 0, n1);
        n.setElement(2, 0, n2);
        n.setElement(3, 0, n3);
        return (n);
	}
	

	/* (non-Javadoc)
     * @see br.ufmg.dees.insane.Shape.Shape#getSecondDerivedShapeFunction
     */
    public IMatrix getSecondDerivedShapeFunction(double[] g, IMatrix cN) {
    	double l = cN.getElement(0,0) - cN.getElement(1,0);
    	double a = g[0];
    	IMatrix n = new IMatrix(4, 1);
        double n0 = (12*a - 6*l) / (l*l*l);
        double n1 = (6*a*l - 4*l*l ) / (l*l*l);
        double n2 = (-12*a + 6*l) / (l*l*l);
        double n3 = (6*a*l - 2*l*l) / (l*l*l);
        n.setElement(0, 0, n0);
        n.setElement(1, 0, n1);
        n.setElement(2, 0, n2);
        n.setElement(3, 0, n3);
        return (n);
    }
    
    /* (non-Javadoc)
     * @see br.ufmg.dees.insane.Shape.Shape#getThirdDerivedShapeFunction
     */
    public IMatrix getThirdDerivedShapeFunction(double[] g, IMatrix cN) {
    	double l = cN.getElement(0,0) - cN.getElement(1,0);
    	IMatrix n = new IMatrix(4, 1);
        double n0 = 12/ (l*l*l);
        double n1 = 6 / (l*l);
        double n2 = -12 / (l*l*l);
        double n3 = 6 / (l*l);
        n.setElement(0, 0, n0);
        n.setElement(1, 0, n1);
        n.setElement(2, 0, n2);
        n.setElement(3, 0, n3);
        return (n);
    }
    
    /* (non-Javadoc)
     * @see br.ufmg.dees.insane.Shape.ShapeCart#getIntegratedShapeFunction
     */
	public IVector getIntegratedShapeFunction(double[] a, double[] b, IMatrix cN) {
		double l = cN.getElement(0,0) - cN.getElement(1,0);
		double x1 = a[0];
		double x2 = b[0];
		IVector n = new IVector(4);
		double n0 = ((x2*x2*x2*x2/2 - x2*x2*x2*l + x2*l*l*l) - (x1*x1*x1*x1/2 - x1*x1*x1*l + x1*l*l*l)) / (l*l*l);
		double n1 = ((x2*x2*x2*x2*l/4 - 2*x2*x2*x2*l*l/3 + x2*x2*l*l*l/2) - (x1*x1*x1*x1*l/4 - 2*x1*x1*x1*l*l/3 + x1*x1*l*l*l/2)) / (l*l*l);
		double n2 = ((-x2*x2*x2*x2/2 + x2*x2*x2*l) - (-x1*x1*x1*x1/2 + x1*x1*x1*l)) / (l*l*l);
		double n3 = ((x2*x2*x2*x2*l/4 - x2*x2*x2*l*l/3) - (x1*x1*x1*x1*l/4 - x1*x1*x1*l*l/3)) / (l*l*l);
		n.setElement(0, n0);
		n.setElement(1, n1);
		n.setElement(2, n2);
		n.setElement(3, n3);
		return (n);
	}
	
	/* (non-Javadoc)
     * @see br.ufmg.dees.insane.Shape.ShapeCart#getIntegratedShapeFunctionTimesX
     */
	public IVector getIntegratedShapeFunctionTimesX(double[] a, double[] b, IMatrix cN) {
		double l = cN.getElement(0,0) - cN.getElement(1,0);
		double x1 = a[0];
		double x2 = b[0];
		IVector n = new IVector(4);
		double n0 = ((2*x2*x2*x2*x2*x2/5 - 3*x2*x2*x2*x2*l/4 + x2*x2*l*l*l/2) - (2*x1*x1*x1*x1*x1/5 - 3*x1*x1*x1*x1*l/4 + x1*x1*l*l*l/2)) / (l*l*l);
		double n1 = ((x2*x2*x2*x2*x2*l/5 - x2*x2*x2*x2*l*l/2 + x2*x2*x2*l*l*l/3) - (x1*x1*x1*x1*x1*l/5 - x1*x1*x1*x1*l*l/2 + x1*x1*x1*l*l*l/3)) / (l*l*l);
		double n2 = ((-2*x2*x2*x2*x2*x2/5 + 3*x2*x2*x2*x2*l/4) - (-2*x1*x1*x1*x1*x1/5 + 3*x1*x1*x1*x1*l/4)) / (l*l*l);
		double n3 = ((x2*x2*x2*x2*x2*l/5 - x2*x2*x2*x2*l*l/4) - (x1*x1*x1*x1*x1*l/5 - x1*x1*x1*x1*l*l/4)) / (l*l*l);
		n.setElement(0, n0);
		n.setElement(1, n1);
		n.setElement(2, n2);
		n.setElement(3, n3);
		return (n);
	}
	
    /* (non-Javadoc)
     * @see br.ufmg.dees.insane.Shape.Shape#getType
     */
    public String getType() {
		return "Cubic1DCart";
	}
	   
}